package xin.fsqr520.project.handle;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import xin.fsqr520.project.domain.po.BaseException;
import xin.fsqr520.project.domain.vo.Result;

import java.util.HashMap;
import java.util.Map;

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    // 捕获DTO校验失败的异常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST) // 返回400状态码
    public Result<?> handleValidationExceptions(MethodArgumentNotValidException ex) {
        // 获取第一个校验错误
        FieldError firstError = ex.getBindingResult().getFieldError();
        if (firstError == null) {
            return Result.error("提交的数据不符合要求");
        }

        // 提取第一个错误的字段名和提示信息
        String fieldName = firstError.getField();
        String errorMessage = firstError.getDefaultMessage();

        // 返回格式：明确提示第一个错误的字段和信息
        return Result.error(String.format("字段%s：%s", fieldName, errorMessage));
    }

/*    // 捕获DTO校验失败的异常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST) // 返回400状态码
    public Map<String, String> handleValidationExceptions(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();

        // 提取所有校验失败的字段和提示信息
        ex.getBindingResult().getAllErrors().forEach((error) -> {
            String fieldName = ((FieldError) error).getField(); // 出错的字段名
            String errorMessage = error.getDefaultMessage(); // 校验注解中定义的message
            errors.put(fieldName, errorMessage);
        });

        // 返回格式：{字段名: 错误信息, ...}
        return errors;
    }*/

    // 处理自定义业务异常（最常用）
    @ExceptionHandler(BaseException.class)
    public Result<?> handleBusinessException(BaseException e) {
        log.warn("业务异常：{}", e.getMessage()); // 仅记录警告日志
        return Result.error(e.getMessage());
    }

    // 处理其他未捕获的异常（兜底）
    @ExceptionHandler(Exception.class)
    public Result<?> handleException(Exception e) {
        log.error("系统异常", e); // 记录错误堆栈，便于排查
        return Result.error("系统繁忙，联系管理猿"); // 隐藏具体错误
    }
}